<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * Trieda určená na aktualizovanie informácií o zamestnancoch, miestnostiach a výučbe
 * v databáze.  
 * 
 * @author Michal Foltin
 */
class Update_model extends CI_Model {

    function __construct() {
        parent::__construct();
    }

    /**
     * Metóda slúži na odstránenie diakritiky z reťazca. Napr. "Mária" -> "maria"
     *  
     * @param string $input - vstupný reťazec 
     * @return string - vsutpný string bez diakritiky v lowercase
     */
    private function convertToAscii($input) {
        $string = html_entity_decode($input, ENT_COMPAT, "UTF-8");

        setlocale(LC_CTYPE, 'en_US.UTF-8');
        $result = iconv("UTF-8", "ASCII//TRANSLIT", $string);

        return strtolower(preg_replace("/['^\"]/", '', $result));
    }

    /**
     * Metóda slúži na aktualizáciu používateľov v databáze. Ak sa používateľ v databáze ešte nenachádza,
     * vytvorí nový záznam v databáze. Novo pridaní používatelia sú typu zamestnanec a nemajú práva admina.
     * Ak pridávaný používateľ nema používateľské meno, jeho username je vytvorené ako "priezviskoBezDiakritiky"."idPouzivatela".
     * 
     * @param array $users - informácie o používateľoch: asociatívne pole obsahujúce kľúče "user_code", "first_name", "surname",
     * "department", "login"
     * @return boolean - true ak sa aktualizácia podarila, false ak nie
     */
    private function parseUsers($users) {

        foreach ($users as $key => $value) {
            if (!isset($value['user_code']) || !isset($value['first_name']) || !isset($value['surname'])
                    || !isset($value['department']) || !isset($value['login'])) {
                return false;
            }
            $user = array(
                'user_code' => $value['user_code'],
                'first_name' => $value['first_name'],
                'surname' => $value['surname'],
                'department' => $value['department'],
                'user_type' => 1
            );

            $getUser = $this->db->get_where('user_info', array('user_code' => $user['user_code']), 1);
            if (wasError()) {
                return false;
            }

            if ($getUser->num_rows() == 0) {
                $this->db->insert('user_info', $user);
                if (wasError()) {
                    return false;
                }

                $getUser = $this->db->get_where('user_info', array('user_code' => $user['user_code']), 1);
                if (wasError()) {
                    return false;
                }
                
                $userId = $getUser->row()->id;

                if ($value['login'] != '') {
                    $username = $value['login'];
                } else {
                    $username = $value['surname'] . $userId;
                    $username = $this->convertToAscii($username);
                }

                $password = $this->encrypt->sha1($username);

                $login = array(
                    'user_id' => $userId,
                    'username' => $username,
                    'password' => $password,
                    'isAdmin' => 0
                );

                $this->db->insert('user_login', $login);
                if (wasError()) {
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * Metóda slúži na aktualizáciu miestností v databáze. Pri aktualizácii su všetky staré záznamy vymazané
     * a miestnosti sú uložené nanovo.
     * 
     * @param array $rooms - informácie o miestnostiach: asociatívne pole obsahujúce kľúč "room_name"
     * @return boolean - true ak sa aktualizácia podarila, false ak nie
     */
    private function parseRooms($rooms) {
        $this->db->query('SET FOREIGN_KEY_CHECKS=0;');
        $this->db->query('TRUNCATE room;');
        $this->db->query('SET FOREIGN_KEY_CHECKS=1;');
        if (wasError()) {
            return false;
        }

        foreach ($rooms as $key => $value) {
            if (!isset($value['room_name'])) {
                return false;
            }
            $this->db->insert('room', $value);
            if (wasError()) {
                return false;
            }
        }

        return true;
    }

    /**
     * Metóda slúži na aktualizáciu výučby v databáze. Pri aktualizácii sú všetky udalosti typu výučba vymazané z databázy
     * a následe importované nanovo.
     * 
     * @param array $events - informácie o výučbe: asociatívne pole s kľúčami "description", "day", "start_time",
     * "end_time", "room", "teachers_list"
     * @return boolean - true ak sa aktualizácia podarila, false ak nie
     */
    private function parseEvents($events) {
        $this->db->query('DELETE FROM user_events WHERE event_id IN (SELECT id FROM event WHERE event_type=1);');
        $this->db->query('DELETE FROM event WHERE event_type=1;');
        if (wasError()) {
            return false;
        }

        foreach ($events as $key => $value) {
            if (!isset($value['day']) || !isset($value['start_time']) || !isset($value['end_time'])
                    || !isset($value['room']) || !isset($value['description'])) {
                return false;
            }
            $getRoom = $this->db->get_where('room', array('room_name' => $value['room']));
            if (wasError()) {
                return false;
            }
            if ($getRoom->num_rows() == 0) {
                return false;
            }
            $roomId = $getRoom->row()->id;

            $event = array(
                'event_type' => 1,
                'description' => $value['description'],
                'event_day' => $value['day'],
                'start_time' => $value['start_time'],
                'end_time' => $value['end_time'],
                'room_id' => $roomId
            );

            $this->db->insert('event', $event);
            if (wasError()) {
                return false;
            }

            $teachers = $value['teachers_list'];

            foreach ($teachers as $k => $v) {
                $getTeacher = $this->db->get_where('user_info', array('user_code' => $v), 1);
                if (wasError()) {
                    return false;
                }

                if ($getTeacher->num_rows() > 0) {
                    $getEvent = $this->db->get_where('event', $event, 1);

                    if (wasError()) {
                        return false;
                    }
                    if ($getEvent->num_rows() == 0) {
                        return false;
                    }
                    $eventId = $getEvent->row()->id;
                    $teacherID = $getTeacher->row()->id;
                    
                    $user_event = array(
                        'user_id' => $teacherID,
                        'event_id' => $eventId
                    );

                    $getUserEvent = $this->db->get_where('user_events', $user_event);
                    
                    if (wasError()) {
                        return false;
                    }
                    if ($getUserEvent->num_rows() == 0) {
                        $this->db->insert('user_events', $user_event);
                    }
                    
                    if (wasError()) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    /**
     * Metóda slúži na aktualizáciu údajov o zamestnancoch, miestnostiach a výučbe v databáze.
     * 
     * @param array $data - informácie ktoré sa budú aktualizovať,
     * asociatívne pole: 
     * array(
     *  teachers => array(
     *    user_code, first_name, surname, department, login
     *  ),
     *  rooms => array(
     *    room_name
     *  ),
     *  events => array(
     *    description, day, start_time, end_time, room, teachers_list => array()
     *  )
     * )
     * @return boolean - true ak sa aktualizácia podarila, false ak nie
     */
    function updateData($data) {
        if (!isset($data) || empty($data) || !isset($data['teachers']) || empty($data['teachers'])
                || !isset($data['rooms']) || empty($data['rooms']) || !isset($data['events']) || empty($data['events'])) {
            return false;
        }

        $this->db->trans_begin();
        if (!$this->parseUsers($data['teachers'])) {
            $this->db->trans_rollback();
            return false;
        }
        if (!$this->parseRooms($data['rooms'])) {
            $this->db->trans_rollback();
            return false;
        }
        if (!$this->parseEvents($data['events'])) {
            $this->db->trans_rollback();
            return false;
        }
        $this->db->trans_commit();

        if (wasError()) {
            $this->db->trans_rollback();
            return false;
        } else {
            return true;
        }
    }

}

?>